package collection.map;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author weim
 * @date 18-8-27
 *
 * 底层  数组+链表
 *
 * 线程安全
 *
 * 扩容原理 resize()  当容量达到 map的大小和扩容因子的乘积时，就会进行扩容
 * 扩容为两倍 newThr = oldThr << 1;
 * 新创建Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap]; 赋值
 *
 * 当单个链表过长时 大于等于 8 TREEIFY_THRESHOLD ，会将链表转化为树
 *
 */
public class MyConcurrentHashMap {

    public static void main(String[] args) {
        //默认大小 16 扩容因子16×0.75f  可以指定
        ConcurrentHashMap<String,String> map = new ConcurrentHashMap<String, String>(10);

        map.put("a","avalue");
        map.put("e","evalue");
        map.put("b","bvalue");
        map.put("f","fvalue");
        map.put("d","dvalue");
        map.put("c","cvalue");
        //不允许key或者value为null
//        map.put(null,null);


        System.out.println(map.toString());

        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
            //安全失败  在iterator遍历的时候，更改map结构，不会抛出异常
            map.put("g","gvalue");
        }

        System.out.println(map.toString());

    }

}
